﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Material
    {
        public long MaterialId { get; set; }
        public string NumeroLote { get; set; }
        public decimal Valor { get; set; }
        public int FornecedorId { get; set; }
        public int TipoMaterialId { get; set; }
        public TipoMaterial Tipo { get; set; }
        public int Quantidade { get; set; }
        public DateTime DataEntrega { get; set; }
        public DateTime? DataValidade { get; set; }
        public DateTime DataCadastro { get; private set; }
        public bool IsNew { get { return this.MaterialId == 0; } }
        public RzCorportativo.DataAccess.Material model;

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                if (this.IsNew)
                {
                    this.DataCadastro = DateTime.Now;
                    this.model = this.Insert(entity);
                }
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                @result = false;
            }).OnSuccess(() =>
            {
                @result = true;
                this.FornecedorId = this.model.FornecedorId;
            });
            return @result;
        }

        private RzCorportativo.DataAccess.Material Insert(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToMaterial(@item);
            return @item;
        }

        private RzCorportativo.DataAccess.Material Update(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private RzCorportativo.DataAccess.Material CreateModel(RZCorporativoEntities entity)
        {
            var Material = new RzCorportativo.DataAccess.Material();
            if (!this.IsNew)
            {
                Material = entity.Material.Where(w => w.MaterialId == this.MaterialId).FirstOrDefault();
                if (Material == null)
                    throw new Exception("Código inválido");
            }

            Material.FornecedorId = this.FornecedorId;
            Material.MaterialId = this.MaterialId;
            Material.NumeroLote = this.NumeroLote;
            Material.DataCadastro = this.DataCadastro;
            Material.DataEntrega = this.DataEntrega;
            Material.DataValidade = this.DataValidade;
            Material.Quantidade = this.Quantidade;
            Material.Valor = this.Valor;
            return Material;
        }

        internal Material CreateMaterial(RzCorportativo.DataAccess.Material item)
        {
            Material Material = new Material();
            Material.FornecedorId = item.FornecedorId;
            Material.MaterialId = item.MaterialId;
            Material.NumeroLote = item.NumeroLote;
            Material.DataCadastro = item.DataCadastro;
            Material.DataEntrega = item.DataEntrega;
            Material.DataValidade = item.DataValidade ?? DateTime.MinValue;
            Material.Quantidade = item.Quantidade;
            Material.Valor = item.Valor;
            return Material;
        }

        public static List<Lib.Material> Listar(Lib.Material Material)
        {
            if (Material == null)
                Material = new Material();
            List<Lib.Material> Materials = new List<Lib.Material>();
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            bool validaDataValidade = (Material.DataValidade ?? DateTime.MinValue).Date > DateTime.MinValue;
            bool validaDataEntrega = Material.DataEntrega.Date > DateTime.MinValue;
            bool validaDataCadastro = Material.DataCadastro.Date > DateTime.MinValue;
            Materials = db.Material.Where(w =>
                    ((Material.FornecedorId == 0) || (Material.FornecedorId == w.FornecedorId)) &&
                    ((Material.MaterialId == 0) || (Material.MaterialId == w.MaterialId)) &&
                    ((Material.NumeroLote == null || Material.NumeroLote == "") || (w.NumeroLote.Contains(Material.NumeroLote))) &&
                    (!validaDataValidade || (Material.DataValidade.Value.Date == w.DataValidade.Value.Date)) &&
                    (!validaDataEntrega || (Material.DataEntrega.Date == w.DataEntrega.Date)) &&
                    (!validaDataCadastro || (Material.DataCadastro.Date == w.DataCadastro.Date))
                ).ToList().Select(s => Material.CreateMaterial(s)).ToList();
            return Materials;
        }
    }
}
